package Filters;
import java.util.regex.Pattern;



public class HtmlCleaner extends Filter{

	private boolean tagAbierto=false;
	private boolean enBody;
	private boolean enScript;

	/*Revisar me parece que pierde texto si en la misma linea del script 
	 * tengo texto que debo tomar en cuenta, o sea palabras 'comunes'*/
	private boolean enScript(String linea){
		boolean resultado=false;
		if(Pattern.matches(".*<[^</\"]*script[^>]*>.*", linea)){
			this.enScript=true;
			resultado=true;
			/*Debo volver a revisar la segunda parte de la linea por si cierra 
			 * el script en la misma*/
			String[] lineaAux = linea.split("<[^</]*script[^>]*>");
			if(lineaAux.length>1){
				this.enScript(lineaAux[1]);}
		}else{
			if((enScript)&&(Pattern.matches(".*<[^<]*/[^<]*script[^>]*>.*", linea))){
				this.enScript=false;
				resultado=false;
			}else{
				if(enScript)
					resultado= true;
				else
					resultado= false;
				
			}
			
		}
		return resultado;

	}
	
	
	
	private boolean entreAlBody(String linea){

		//linea = linea.replace(".*<[^</]*body[^>]*>","body");
		//if(linea.indexOf("body")==-1){
		if(!Pattern.matches(".*<[^</]*body[^>]*>.*", linea)){
			return false;

		}
		return true;

	}

	private boolean sigoEnBody(String linea){

		//String lineaAux = linea.replace("<[^<]*/[^<]*body[^>]*>","body");
		//if((linea.compareTo(lineaAux)==0)&&(lineaAux.indexOf("body")==-1)){
		if(!Pattern.matches(".*<[^<]*/[^<]*body[^>]*>.*", linea)){

			return true;

		}
		return false;

	}

	/*Recibo la linea "sucia" y la retorno sin tags  */
	private String limpiarTagsLinea(String linea){

		
		String lineaTemporal="";


		lineaTemporal = linea;
		/*Si encuentro un tag abierto voy a descartar lineas hasta que aparezca el cierre*/
		if((lineaTemporal.indexOf("<")!=-1)&&(lineaTemporal.indexOf(">")==-1)){
				this.tagAbierto=true;
		}else{
			/*Una vez que aparece el cierre del tag seteo el flag para volver a considerar las lineas*/
			if((lineaTemporal.indexOf("<")==-1)&&(lineaTemporal.indexOf(">")!=-1)) this.tagAbierto=false;
		}

		if(!this.tagAbierto){
			/*Esta ExpReg reemplaza todo lo que este entre tags por un caracter vacio*/
			lineaTemporal = lineaTemporal.replaceAll("<[^<]*>"," ");
			/*Esta ExpReg reemplaza cuando tenemos un tag que se abre en una linea pero no esta cerrado en la misma*/
			lineaTemporal = lineaTemporal.replaceAll("<[^>]*$"," ");
			/*Esta ExpReg reemplaza cuando la linea empieza con un tag que se abrio en un linea anterior y se cierra en la actual*/
			lineaTemporal = lineaTemporal.replaceAll("[^<]*>"," ");
		}else{
			lineaTemporal="";
		}



		return lineaTemporal ;

	}

	public String procesarLinea(String lineaHtml){
			lineaHtml = lineaHtml.trim();
			if(!enBody){
				enBody = this.entreAlBody(lineaHtml);
				/*Chequeo por si en la misma linea del body tengo texto a procesar*/
				if(enBody) {
					lineaHtml = lineaHtml.replaceAll(".*<[^</]*body[^>]*>",""); /*FIX ME--- no deberia estar aca*/
					lineaHtml = this.limpiarTagsLinea(lineaHtml);
				}else{
					lineaHtml="";
				}
				//lineaHtml = this.procesarLinea(lineaHtml);
			}else{
				enBody = this.sigoEnBody(lineaHtml);
				if(!enBody)lineaHtml = lineaHtml.replaceAll("<[^<]*/[^<]*body[^>]*>.*",""); /*FIX ME------ no deberia estar aca*/
				
				if(!this.enScript(lineaHtml))
					lineaHtml = this.limpiarTagsLinea(lineaHtml);
				else
					lineaHtml="";

			}
			//lineaHtml = this.procesarLinea(lineaHtml);
			return lineaHtml;
	}






}
